/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package mundo;

import interfaz.HiloRetardo;
import objetos.*;
import objetos.personajes.*;

/**
 *
 * @author Yanire && Cesar && CARLOS && CARLOS && CARLOS
 */
public class InteligenciaArtificial {

    private GestorMapas gestor;

    public InteligenciaArtificial(GestorMapas gestor) {
        this.gestor = gestor;
    }

    static final int atacar = 0;
    static final int comprar = 1;
    static final int mover = 2;
    public int cantCompras=0;
    public int cantComprasMax=2;
    public int[] array1 = {atacar, atacar, atacar, mover};
    public int[] array2 = {mover, mover, mover, atacar};
    public int[] array3 = {comprar, comprar, mover, mover};
    public int[] dirDerecha = {3, 3, 12, 6};
    public int[] dirIzquierda = {9, 9, 12, 6};
    public int[] dirArriba = {12, 12, 3, 9};
    public int[] dirAbajo = {6, 6, 3, 9};

    public void movimientoArtificial(Personaje personajePC) {
        Mapa mapa = gestor.getMapa();

        int x = personajePC.getX();
        int y = personajePC.getY();
        int direccion, accion = 2;

        if ((direccion = mapa.hayEnemigoAdyacente(personajePC)) != 0) {
            int num = gestor.generarAleatorio(4);
            accion = array1[num];
            //System.out.println(direccion+" ");
        }else

        if (((direccion = mapa.hayAldeaAdyacente(personajePC)) != 0)) {
            int num = gestor.generarAleatorio(4);
            accion = array3[num];
        }

        switch (accion) {
            case mover:
                soloMover(personajePC);
                break;
            case atacar:
                soloAtacar(personajePC, direccion);
                break;
            case comprar:
                if (cantCompras!=cantComprasMax){
                    soloComprar(personajePC, direccion);
                    cantCompras++;
                }
                break;
        }


    }

    public void soloMover(Personaje personajePC) {
        Mapa mapa = gestor.getMapa();
        //Si no puede realizar una compra vuelve a correr el turno?
        //Batallon batallon = gestor.getBatallones()[turno], batallonAtaca;

        //Toma las coordenadas del batallon actual
        int x = personajePC.getX();
        int y = personajePC.getY();
        int num;
        int dir;

        switch (personajePC.dirAnt) {
            case 12:
                num = gestor.generarAleatorio(4);
                dir = dirArriba[num];
                switch (dir) {
                    case 12:
                        y--;
                        personajePC.dirAnt=12;
                        break;//arriba
                    case 3:
                        x++;
                        personajePC.dirAnt=3;
                        break;//derecha
                    case 9:
                        x--;
                        personajePC.dirAnt=9;
                        break;//izq
                    case 6:
                        y++;
                        personajePC.dirAnt=6;
                        break;//abajo
                }
                break;//arriba
            case 3:
                num = gestor.generarAleatorio(4);
                dir = dirDerecha[num];
                switch (dir) {
                    case 12:
                        y--;
                        personajePC.dirAnt=12;
                        break;//arriba
                    case 3:
                        x++;
                        personajePC.dirAnt=3;
                        break;//derecha
                    case 9:
                        x--;
                        personajePC.dirAnt=9;
                        break;//izq
                    case 6:
                        y++;
                        personajePC.dirAnt=6;
                        break;//abajo
                }
                break;//derecha
            case 9:
                num = gestor.generarAleatorio(4);
                dir = dirIzquierda[num];
                switch (dir) {
                    case 12:
                        y--;
                        personajePC.dirAnt=12;
                        break;//arriba
                    case 3:
                        x++;
                        personajePC.dirAnt=3;
                        break;//derecha
                    case 9:
                        x--;
                        personajePC.dirAnt=9;
                        break;//izq
                    case 6:
                        y++;
                        personajePC.dirAnt=6;
                        break;//abajo
                }
                break;//izq
            case 6:
                num = gestor.generarAleatorio(4);
                dir = dirAbajo[num];
                switch (dir) {
                    case 12:
                        y--;
                        personajePC.dirAnt=12;
                        break;//arriba
                    case 3:
                        x++;
                        personajePC.dirAnt=3;
                        break;//derecha
                    case 9:
                        x--;
                        personajePC.dirAnt=9;
                        break;//izq
                    case 6:
                        y++;
                        personajePC.dirAnt=6;
                        break;//abajo
                }
                break;//abajo
        }
        
        if (mapa.esCeldaDeMapa(x, y) && mapa.getCelda(x, y).getTipo().equals("Vacio")) {
            //Si es un movimiento valido
            mapa.modificaCelda(x, y, personajePC);
        }
    }

    public void soloComprar(Personaje personajePC, int direccion){
        Mapa mapa = gestor.getMapa();
        Aldea aldea = mapa.getAldeaAdyacente(personajePC, direccion);
        if ((mapa.noRodearAldea(aldea) == false)) {
                soloComprarPersonajeArtificial( personajePC, direccion);
            }
    }

    public boolean soloComprarPersonajeArtificial( Personaje personajePC, int direccion){
        Mapa mapa = gestor.getMapa();

        int x = personajePC.getX();
        int y = personajePC.getY();

        switch (direccion) {
            case 9:
                x--;
                break;
            case 3:
                x++;
                break;
            case 12:
                y--;
                break;
            case 6:
                y++;
                break;
        }

        Aldea aldea = (Aldea) (mapa.getCelda(x, y).getObjeto());
        Personaje personaje = aldea.comprarPersonajeArtificial(gestor.getBandos()[gestor.getRival()]);
        if (personaje != null) {
            personaje.setDireccionCompra(2);
            HiloRetardo retardo = new HiloRetardo(gestor.getBandos()[gestor.getRival()], personaje, gestor.getControlador(), aldea);
            retardo.start();

            //gestor.getControlador().asignarCelda(aldea, personaje);

        }
        return personaje != null;
    }

    public boolean soloAtacar(Personaje personajePC, int direccion){
        Mapa mapa = gestor.getMapa();
        return gestor.atacarPC(personajePC, direccion);
    }
}
